/**
 */
package com.dingpeikeji.quickdeer.core.modules.realsche.service;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dingpeikeji.quickdeer.core.common.config.Global;
import com.dingpeikeji.quickdeer.core.common.persistence.Page;
import com.dingpeikeji.quickdeer.core.common.service.CrudService;
import com.dingpeikeji.quickdeer.core.common.utils.DateUtils;
import com.dingpeikeji.quickdeer.core.common.utils.StringUtils;
import com.dingpeikeji.quickdeer.core.modules.bus.entity.TCompBus;
import com.dingpeikeji.quickdeer.core.modules.bus.service.TCompBusService;
import com.dingpeikeji.quickdeer.core.modules.driver.entity.TDrivers;
import com.dingpeikeji.quickdeer.core.modules.driver.service.TDriversService;
import com.dingpeikeji.quickdeer.core.modules.orders.entity.TOrders;
import com.dingpeikeji.quickdeer.core.modules.orders.service.TOrdersService;
import com.dingpeikeji.quickdeer.core.modules.realsche.dao.TRealscheBoardDao;
import com.dingpeikeji.quickdeer.core.modules.realsche.dao.TRealscheDao;
import com.dingpeikeji.quickdeer.core.modules.realsche.dao.TRealscheOffDao;
import com.dingpeikeji.quickdeer.core.modules.realsche.dao.TRealscheVehiDao;
import com.dingpeikeji.quickdeer.core.modules.realsche.entity.TRealsche;
import com.dingpeikeji.quickdeer.core.modules.realsche.entity.TRealscheBoard;
import com.dingpeikeji.quickdeer.core.modules.realsche.entity.TRealscheOff;
import com.dingpeikeji.quickdeer.core.modules.realsche.entity.TRealscheVehi;
import com.dingpeikeji.quickdeer.core.modules.site.entity.TSitedtl;
import com.dingpeikeji.quickdeer.core.modules.site.service.TSitedtlService;
import com.dingpeikeji.quickdeer.core.modules.vehi.entity.TRealscheVehis;
import com.dingpeikeji.quickdeer.modules.sms.entity.Sms;
import com.dingpeikeji.quickdeer.modules.sms.service.SmsApi;
import com.dingpeikeji.quickdeer.modules.wx.driver.vo.TemplateData;
import com.dingpeikeji.quickdeer.modules.wx.driver.vo.WxTemplate;
import com.dingpeikeji.quickdeer.modules.wx.util.TimedTask;
import com.dingpeikeji.quickdeer.modules.wx.util.WeixinUtil;

/**
 * 实际班次Service
 * 
 * @author Zhaoy
 * @version 2016-06-12
 */
@Service
@Transactional(readOnly = true)
public class TRealscheService extends CrudService<TRealscheDao, TRealsche> {

	@Autowired
	private TRealscheBoardDao tRealscheBoardDao;
	@Autowired
	private TRealscheDao tRealscheDao;
	@Autowired
	private TRealscheOffDao tRealscheOffDao;
	@Autowired
	private TRealscheVehiDao tRealscheVehiDao;
	@Autowired
	private TSitedtlService tSitedtlService;
	@Autowired
	private TCompBusService compBusService;
	@Autowired
	private TDriversService drvService;
	@Autowired
	private TOrdersService ordersService;

	public TRealsche get(String id) {
		//TRealsche tRealsche = super.get(id);
		List<TRealsche> tRealscheList = tRealscheDao.getList(id);
		TRealsche tRealsche = tRealscheList.get(0);
		TRealscheBoard realscheBoard = new TRealscheBoard();
		TRealscheOff realscheOff = new TRealscheOff();
		TRealscheVehi realscheVehi = new TRealscheVehi();
		realscheBoard.setRealscheid(tRealsche.getRealscheid());
		realscheOff.setRealscheid(tRealsche.getRealscheid());
		realscheVehi.setRealscheid(tRealsche.getRealscheid());
		tRealsche.setTRealscheBoardList(tRealscheBoardDao.findList(realscheBoard));
		tRealsche.setTRealscheOffList(tRealscheOffDao.findList(realscheOff));
		tRealsche.setTRealscheVehiList(tRealscheVehiDao.findList(realscheVehi));
		return tRealsche;
	}

	public List<TRealsche> findList(TRealsche tRealsche) {
		return super.findList(tRealsche);
	}

	public Page<TRealsche> findPage(Page<TRealsche> page, TRealsche tRealsche) {
		return super.findPage(page, tRealsche);
	}

	@Transactional(readOnly = false)
	public void save(TRealsche tRealsche) {
		if (StringUtils.isEmpty(tRealsche.getRealscheid())) {
			dao.insert(tRealsche);
		} else {
			dao.update(tRealsche);
		}
		// 操作上客点
		List<TRealscheBoard> tRealscheBoardList = tRealsche.getTRealscheBoardList();
		long boardNum = 0;
		if (tRealscheBoardList != null && !tRealscheBoardList.isEmpty()) {
			for (TRealscheBoard tRealscheBoard : tRealsche.getTRealscheBoardList()) {
				if (tRealscheBoard.getId() != null) {
					TSitedtl tSitedtl = tSitedtlService.get(tRealscheBoard.getSiteid());
					tRealscheBoard.setCityname(tSitedtl.getCityname());
					tRealscheBoard.setBoardaddr(tSitedtl.getSitename());

					if (tRealscheBoard.getRetailprice() == "" || tRealscheBoard.getRetailprice().isEmpty())
						tRealscheBoard.setRetailprice(null);
					if (tRealscheBoard.getSettleprice() == "" || tRealscheBoard.getSettleprice().isEmpty())
						tRealscheBoard.setSettleprice(null);
					if (tRealscheBoard.getDiffdays() > 0) {
						Calendar cal = Calendar.getInstance();
						cal.setTime(tRealsche.getDepartdate());
						cal.add(Calendar.DATE, tRealscheBoard.getDiffdays());
						tRealscheBoard
								.setRealboardtime((new SimpleDateFormat("yyyy-MM-dd")).format(cal.getTime()).toString()
										+ " " + tRealscheBoard.getBoardtime());
					} else
						tRealscheBoard.setRealboardtime(
								(new SimpleDateFormat("yyyy-MM-dd")).format(tRealsche.getDepartdate()).toString() + " "
										+ tRealscheBoard.getBoardtime());

					boardNum = boardNum + 1;
					tRealscheBoard.setSeqno(String.valueOf(boardNum));
					if (StringUtils.isEmpty(tRealscheBoard.getRealscheid())) {
						tRealscheBoard.setRealscheid(tRealsche.getRealscheid());
						tRealscheBoardDao.insert(tRealscheBoard);
					} else {
						tRealscheBoardDao.update(tRealscheBoard);
					}
				} else {
					tRealscheBoardDao.delete(tRealscheBoard);
				}
			}
		}

		// 操作下客点
		List<TRealscheOff> tRealscheOffList = tRealsche.getTRealscheOffList();
		long offNum = 0;
		if (tRealscheOffList != null && !tRealscheOffList.isEmpty()) {
			for (TRealscheOff tRealscheOff : tRealsche.getTRealscheOffList()) {
				if (tRealscheOff.getId() != null) {
					TSitedtl tSitedtl = tSitedtlService.get(tRealscheOff.getSiteid());
					tRealscheOff.setCityname(tSitedtl.getCityname());
					tRealscheOff.setOffaddr(tSitedtl.getSitename());

					if (tRealscheOff.getRetailprice() == "" || tRealscheOff.getRetailprice().isEmpty())
						tRealscheOff.setRetailprice(null);
					if (tRealscheOff.getSettleprice() == "" || tRealscheOff.getSettleprice().isEmpty())
						tRealscheOff.setSettleprice(null);

					offNum = offNum + 1;
					tRealscheOff.setSeqno(String.valueOf(offNum));
					if (StringUtils.isEmpty(tRealscheOff.getRealscheid())) {
						tRealscheOff.setRealscheid(tRealsche.getRealscheid());
						tRealscheOffDao.insert(tRealscheOff);
					} else {
						tRealscheOffDao.update(tRealscheOff);
					}
				} else {
					tRealscheOffDao.delete(tRealscheOff);
				}
			}
		}

		// 操作车辆
		List<TRealscheVehi> tRealscheVehiList = tRealsche.getTRealscheVehiList();
		if (tRealscheVehiList != null && !tRealscheVehiList.isEmpty()) {
			for (TRealscheVehi tRealscheVehi : tRealsche.getTRealscheVehiList()) {
				if (tRealscheVehi.getId() != null) {
					TCompBus tCompBus = compBusService.get(String.valueOf(tRealscheVehi.getBusid()));
					tCompBus.setLicenseno(tRealscheVehi.getLicno());
					tRealscheVehi.setLicno(tCompBus.getLicenseno());
					tRealscheVehi.setBrandname(tCompBus.getBrand());
					tRealscheVehi.setVicedriver(tCompBus.getVicedriver());
					tRealscheVehi.setMaindriver(tCompBus.getMaindriver());
					tRealscheVehi.setCargotypeid(tCompBus.getCartype().getCargotypeid());
					tRealscheVehi.setSchekind("1");
					if (StringUtils.isEmpty(tRealscheVehi.getRealscheid())) {
						tRealscheVehi.setRealscheid(tRealsche.getRealscheid());
						tRealscheVehiDao.insert(tRealscheVehi);
					} else {
						tRealscheVehiDao.update(tRealscheVehi);
					}
				} else {
					tRealscheVehiDao.delete(tRealscheVehi);
				}
			}
		}
	}

	@Transactional(readOnly = false)
	public void dispatch(TRealsche tRealsche) {
		dao.dispatch(tRealsche);

		List<TRealscheVehi> tRealscheVehiList = tRealsche.getTRealscheVehiList();
		if (tRealscheVehiList != null && !tRealscheVehiList.isEmpty()) {
			for (TRealscheVehi tRealscheVehi : tRealsche.getTRealscheVehiList()) {
				TCompBus tCompBus = compBusService.get(String.valueOf(tRealscheVehi.getBusid()));
				tRealscheVehi.setLicno(tCompBus.getLicenseno());
				tRealscheVehi.setVehistatus(TRealscheVehis.VEHI_ST_CONFIRMED);
				tRealscheVehi.setBrandname(tCompBus.getBrand());
				tRealscheVehi.setVicedriver(tCompBus.getVicedriver());
				tRealscheVehi.setMaindriver(tCompBus.getMaindriver());
				tRealscheVehi.setCargotypeid(tCompBus.getCartype().getCargotypeid());
				tRealscheVehiDao.dispatch(tRealscheVehi);
				
				//通知客户
				if (!tRealsche.getOrder().getPayertel().equals("")){
					Sms sendSms = new Sms();
					TDrivers tmpDrivers = drvService.get(tRealscheVehi.getMaindriver());
					sendSms.setMobile(tRealsche.getOrder().getPayertel());
					sendSms.setContent("尊敬的"+tRealsche.getOrder().getContacts()+
								"，您在霞客约车购买的用车服务已经派单，车牌号为："+tRealscheVehi.getLicno()+
								"，请及时与驾驶员"+tmpDrivers.getDrvname() +
								"师傅联系，手机号为"+tmpDrivers.getMobile()+
								"，请按照预定时间到达上车地点。祝您出行愉快！");
					try {
						SmsApi.sendSms(sendSms);
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				//微信通知司机
				TDrivers tmpDrivers = drvService.get(tRealscheVehi.getMaindriver());
				//获取微信id
				String wechatid = tmpDrivers.getWechatid();
				if (wechatid!=null&&!"".equals(wechatid)){ 
					TRealscheService.sendMes(tmpDrivers, tRealsche, tRealscheVehi);
				}
			}
		}
	}
	/**  发送模板
	*   {{first.DATA}} 
		订单号：{{keyword1.DATA}} 
		订单名称：{{keyword2.DATA}} 
		发车时间：{{keyword3.DATA}}
		包车天数：{{keyword4.DATA}} 
		上车地点：{{keyword5.DATA}}
		车牌号：{{keyword6.DATA}} 
		用车单位：{{keyword7.DATA}} 
		{{remark.DATA}}
	*/
	/*{{first.DATA}}
	订单号：{{keyword1.DATA}}
	订单信息：{{keyword2.DATA}}
	订单时间：{{keyword3.DATA}}
	指派车辆：{{keyword4.DATA}}
	{{remark.DATA}}*/
	public static void sendMes(TDrivers tmpDrivers,TRealsche tRealsche,TRealscheVehi tRealscheVehi){
		WxTemplate template = new WxTemplate();  
		//template.setUrl(TimedTask.websiteAndProject+"/d/realschevehi/taskList?wechatid="+tmpDrivers.getWechatid());  
		template.setUrl("https://www.xiakeyueche.com/wx/d/realschevehi/taskList?wechatid="+tmpDrivers.getWechatid());  
		template.setTouser(tmpDrivers.getWechatid());  
		template.setTopcolor("#000000"); 
		//加载模版id
		String templateId = Global.getConfig("Template_id");
		template.setTemplate_id(templateId);  
		Map<String,TemplateData> m = new HashMap<String,TemplateData>();  
		//获取订单信息
		TOrders order = tRealsche.getOrder();
		//第一个模版数据
		TemplateData first = new TemplateData();  
		first.setColor("#000000");  
		first.setValue("你有新的发车计划");  
		m.put("first", first);  
		
		//订单号：{{keyword1.DATA}}
		TemplateData keyword1 = new TemplateData();  
		keyword1.setColor("#328392"); 
		keyword1.setValue(order.getOrderid());  
		m.put("keyword1", keyword1); 
		
		//订单名称：{{keyword2.DATA}} 
		TemplateData keyword2 = new TemplateData();  
		keyword2.setColor("#328392"); 
		keyword2.setValue(tRealsche.getSchename());  
		m.put("keyword2", keyword2);  
		
		//发车时间：{{keyword3.DATA}}
		TemplateData keyword3 = new TemplateData();  
		keyword3.setColor("#328392");  
		String formatDateTime = DateUtils.formatDateTime(order.getDepartdate());
		keyword3.setValue(formatDateTime);  
		m.put("keyword3", keyword3);  
		
		//包车天数：{{keyword4.DATA}}
		TemplateData keyword4 = new TemplateData();  
		keyword4.setColor("#328392");  
		keyword4.setValue(tRealscheVehi.getLicno());  
		m.put("keyword4", keyword4);  
		
		/*//上车地点：{{keyword5.DATA}}
		TemplateData keyword5 = new TemplateData();  
		keyword5.setColor("#328392"); 
		keyword5.setValue(order.getBoardaddr());  
		m.put("keyword5", keyword5);  
		
		//车牌号：{{keyword6.DATA}} 
		TemplateData keyword6 = new TemplateData();  
		keyword6.setColor("#328392"); 
		keyword6.setValue(tRealscheVehi.getLicno());  
		m.put("keyword6", keyword6);  
		
		//用车单位：{{keyword7.DATA}} 
		TemplateData keyword7 = new TemplateData();  
		keyword7.setColor("#328392"); 
		String clientname = order.getClientname();
		if (clientname==null) {
			clientname = "霞客约车";
		}
		keyword7.setValue(clientname);  
		m.put("keyword7", keyword7);  */
		
		TemplateData remark = new TemplateData();  
		remark.setColor("#929232");  
		remark.setValue("请及时进行确认！");  
		m.put("remark", remark);  
		
		//发送模板消息前获取token 
		WeixinUtil.sendMessageBefore(templateId,template, m);     
	}
	@Transactional(readOnly = false)
	public void delete(TRealsche tRealsche) {
		TRealscheBoard realscheBoard = new TRealscheBoard();
		TRealscheOff realscheOff = new TRealscheOff();
		TRealscheVehi realscheVehi = new TRealscheVehi();
		realscheBoard.setRealscheid(tRealsche.getRealscheid());
		realscheOff.setRealscheid(tRealsche.getRealscheid());
		realscheVehi.setRealscheid(tRealsche.getRealscheid());
		super.delete(tRealsche);
		tRealscheBoardDao.delete(realscheBoard);
		tRealscheOffDao.delete(realscheOff);
		tRealscheVehiDao.delete(realscheVehi);
	}

	public void updateState(String realscheid) {
		tRealscheDao.updateState(realscheid);
	}

	public String findOfferMount(String realscheid) {
		return tRealscheDao.findOfferMount(realscheid);
	}

	public void updateStateForShare(String realscheid) {
		tRealscheDao.updateStateForShare(realscheid);
	}

	public void updateDispstatusForShare(String realscheid) {
		tRealscheDao.updateDispstatusForShare(realscheid);
	}

	public void insertOffline(TRealsche tRealsche){
		 tRealscheDao.insertOffline(tRealsche);
	}
	
	//查看调度情况
	public Page<TRealscheVehi> findVehiPage(Page<TRealscheVehi> page, TRealscheVehi tRealscheVehi) {
		tRealscheVehi.setPage(page);
		page.setList(tRealscheVehiDao.findVehiList(tRealscheVehi));
		return page;
	}
}
